package com.panghl.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @Author panghl
 * @Date 2022/1/24
 * @Description 顺序测试   spring4 和spring5 有区别！！！
 * spring5 :
 * 正常：
 * ****** 我是环绕通知之前AAA
 * ****** @Before我是前置通知
 * ****** @AfterReturning我是返回通知
 * ****** @After我是后置通知
 * ****** 我是环绕通知之后BBB
 * 异常：
 * ****** 我是环绕通知之前AAA
 * ****** @Before我是前置通知
 * ****** @AfterThrowing我是异常通知
 * ****** @After我是后置通知
 *
 * spring4:
 * 正常：
 * ****** 我是环绕通知之前AAA
 * ****** @Before我是前置通知
 * ****** 我是环绕通知之后BBB
 * ****** @After我是后置通知
 * ****** @AfterReturning我是返回通知
 *
 * 异常：
 * ****** 我是环绕通知之前AAA
 * ****** @Before我是前置通知
 * ****** @After我是后置通知
 * ****** @AfterThrowing我是异常通知
 **/
@Aspect
@Component
public class MyAscept {
    @Pointcut("execution(* com.panghl.controller.*.*(..))")
    public void pointCut(){}
    @Before("pointCut()")
    public void beforeNotify(){System.out.println("****** @Before我是前置通知"); }
    @After("pointCut()")
    public void afterNotify(){System.out.println("****** @After我是后置通知"); }
    @AfterReturning("pointCut()")
    public void afterReturningNotify(){ System.out.println("****** @AfterReturning我是返回通知"); }
    @AfterThrowing("pointCut()")
    public void afterThrowingNotify(){ System.out.println("****** @AfterThrowing我是异常通知"); }
    @Around("pointCut()")
    public Object aroundNotify(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        Object retValue = null;
        System.out.println("****** 我是环绕通知之前AAA");
        retValue = proceedingJoinPoint.proceed();
        System.out.println("****** 我是环绕通知之后BBB");
        return retValue;
    }
}
